home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / zoo21src.zoo / mstime.i < prev    next >
Text File  |  1991-07-24  |  3KB  |  96 lines

  1. #ifndef LINT
  2. static char mstimeid[]="@(#) mstime.i 2.2 88/01/24 12:47:58";
  3. #endif /* LINT */
  4.  
  5. /*
  6. (C) Copyright 1987 Rahul Dhesi -- All rights reserved
  7. */
  8.  
  9. #define BASEYEAR 1970
  10.  
  11. /****************
  12. Function mstime() converts time in seconds since January 1 of BASEYEAR
  13. to MS-DOS format date and time.
  14. */
  15. void mstime(longtime, date, time)
  16. long longtime;       /* input:  seconds since Jan 1, BASEYEAR   */
  17. int *date, *time;    /* output: MS-DOS format date and time */
  18.  
  19. {
  20.    static int daysinmo[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  21. #define FEBRUARY 1
  22.    int year, month, day, hour, min, sec;
  23.    long secsinhour, secsinday, secsinyear, secsinleapyear;
  24.  
  25.    int leapyear;                             /* is this a leap year? */
  26.    int done;                                 /* control variable */
  27.  
  28.    secsinhour = (long) (60 * 60);            /* seconds in an hour */
  29.    secsinday  = 24 * secsinhour;             /* seconds in a day */
  30.    secsinyear = 365 * secsinday;             /* seconds in a year */
  31.    secsinleapyear = secsinyear + secsinday;  /* seconds in a leap year */
  32.  
  33. #ifdef DEBUG
  34. printf("mstime:  input longtime = %ld\n", longtime);
  35. #endif
  36.  
  37.    /* We can't handle dates before 1970 so force longtime positive */
  38.    if (longtime < 0)
  39.       longtime = 0;
  40.  
  41.    /* 
  42.    Step through years from BASEYEAR onwards, subtracting number of
  43.    seconds in each, stopping just before longtime would become negative.
  44.    */
  45.    year = BASEYEAR;
  46.    done = 0;
  47.    while (!done) {
  48.       long yearlength;
  49.       leapyear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
  50.       if (leapyear)
  51.          yearlength = secsinleapyear;
  52.       else
  53.          yearlength = secsinyear;
  54.  
  55.       if (longtime >= yearlength) {
  56.          longtime -= yearlength;
  57.          year++;
  58.       } else
  59.          done++;
  60.    }
  61.  
  62.    /* Now `year' contains year and longtime contains remaining seconds */
  63.    daysinmo[FEBRUARY] = leapyear ? 29 : 28;
  64.  
  65.    month = 0; /* range is 0:11 */
  66.    while (longtime > daysinmo[month] * secsinday) {
  67.       longtime = longtime - daysinmo[month] * secsinday;
  68.       month++;
  69.    }
  70.    month++; /* range now 1:12 */
  71.  
  72.    day = longtime / secsinday;     /* day of month, range 0:30 */
  73.    longtime = longtime % secsinday;
  74.    day++;                         /* day of month, range 1:31 */
  75.  
  76.    hour = longtime / secsinhour;       /* hours, range 0:23 */
  77.    longtime = longtime % secsinhour;
  78.  
  79.    min = longtime / 60L;               /* minutes, range 0:59 */
  80.    longtime = longtime % 60L;
  81.  
  82.    sec = longtime;                     /* seconds, range 0:59 */
  83.  
  84. #ifdef DEBUG
  85. printf("mstime:  date = %4d/%02d/%02d   time = %02d:%02d:%02d\n",
  86.       year, month, day, hour, min, sec);
  87. if (leapyear)
  88.    printf("(leap year)\n");
  89. #endif
  90.  
  91.    if (year < 1980)
  92.       year = 1980;
  93.    *date = day + (month << 5) + ((year - 1980) << 9);
  94.    *time = (sec / 2) + (min << 5) + (hour << 11);
  95. }
  96.